ES6 中 Reflect 对象,它什么优点
有点:优雅、语义化易读、错误处理
它是对 Object 一些明显内部的方法(defineProperty), 放到 Reflect 对象上,
object 在使用的时候,不抛错,Reflect 是返回 true fasle
js
//老写法
try {
Object.defineProperty(target, property, attributes);
//successs
} catch (e) {
//failure
}
//新写法
if (Reflect.defineProperty(target, property, attributes)) {
//success
} else {
//failure
}
- Reflect 更加语义化 get set has, 容易读
js
//老写法
Function.prototype.apply.call(Math.floor, undefined, [1.75]); //1
//新写法
Reflect.apply(Math.floor, undefined, [1.75]); //1
let obj = {
label: "A",
value: 20,
};
Reflect.deleteProperty(obj, "value");
console.log(obj); // [object Object] { label: "A" }
Reflect.has(obj, "label"); // true
console.log(Reflect.get(obj, "label")); // 'A'
- proxy
js
var cat = {
name: "cat",
};
var loggedObj = new Proxy(cat, {
get: function (target, name) {
console.log("get" + name);
return Reflect.get(target, name);
},
set: function (target, name) {
console.log("set" + name);
Reflect.set(target, name);
},
has: function (target, name) {
console.log("has" + name);
return Reflect.has(target, name);
},
});
console.log((loggedObj["value"] = "123"));
receiver
receiver的作用是 如果我们的源对象(obj)有setter,getter的访问器属性,那么可以通过receiver来改变里面的this
js
const obj = {
_name: 'xwl',
get name() {
//相当于objProxy._name,再一次通过Proxy创建的代理
return this._name
},
set name(newValue) {
this._name = newValue
}
}
const objProxy = new Proxy(obj, {
// receiver是创建出来的代理对象
get(target, key, receiver) {
console.log('get的操作触发了')
return Reflect.get(target, key, receiver)
},
set(target, key, newValue, receiver) {
console.log('set的操作触发了')
Reflect.set(target, key, newValue, receiver)
}
})
// objProxy.name = 'xxx'
console.log(objProxy.name)